using System;
using EnvDTE;
using Microsoft.VisualStudio.VCProject;
using VSSDKAssist.Assets.Helpers;
using VSSDKAssist.Assets.ValueProviders.Base;

namespace VSShellAssist.Recipes.Common.ValueProviders
{
	/// <summary>
	/// Value provider for the pkgdef project item
	/// </summary>
    public class PkgDefProjectItemValueProvider : ValueProviderBase
	{
        #region Constants
        private const string VSShellProjectArgument = "VSShellProjectArgument";
        #endregion

        #region Fields
        private string vsShellProjectArgument;
        #endregion

		#region Public Implementation

		/// <summary>
		/// Contains code that will be called when recipe execution begins. This is the first method in the lifecycle.
		/// </summary>
		/// <param name="currentValue">An <see cref="T:System.Object"/> that contains the current value of the argument.</param>
		/// <param name="newValue">When this method returns, contains an <see cref="T:System.Object"/> that contains
		/// the new value of the argument, if the returned value
		/// of the method is <see langword="true"/>. Otherwise, it is ignored.</param>
		/// <returns>
		/// 	<see langword="true"/> if the argument value should be replaced with
		/// the value in <paramref name="newValue"/>; otherwise, <see langword="false"/>.
		/// </returns>
		/// <remarks>By default, always returns <see langword="false"/>, unless overriden by a derived class.</remarks>
        public override bool OnBeforeActions(object currentValue, out object newValue)
		{
			newValue = null;

			if((currentValue == null) && (this.ExecutionStage != Stage.OnBeginRecipe))
			{
                Project project = DictionaryService.GetValue(vsShellProjectArgument) as Project;

                if(project != null &&
                    project.Kind.Equals(vcContextGuids.vcContextGuidVCProject, StringComparison.OrdinalIgnoreCase))
                {
                    ProjectItemIterator iterator = new ProjectItemIterator(project);

                    foreach(ProjectItem projectItem in iterator)
                    {
                        try
                        {
                            if(projectItem.Properties.Item("Extension").Value.ToString().Equals(
                                Properties.Resources.PkgDefExtension, StringComparison.OrdinalIgnoreCase))
                            {
                                newValue = projectItem;
                                return true;
                            }
                        }
                        catch
                        {
                            //Do nothing, goto the next ProjectItem
                        }
                    }
                }

                return false;
			}

			return false;
		}
		#endregion

        protected override void OnConfigure(System.Collections.Specialized.StringDictionary attributes)
        {
            if(attributes == null)
                throw new ArgumentNullException("attributes");

            if(attributes.ContainsKey(VSShellProjectArgument))
            {
                vsShellProjectArgument = attributes[VSShellProjectArgument];
            }
        }
	}
}